Kubernetes基礎
Kubernetes(K8s)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースプラットフォームです。本ドキュメントでは、Kubernetesの基本概念と主要なリソース、そしてAzure Kubernetes Service (AKS) 特有のアーキテクチャについて解説します。
Kubernetesとは
Kubernetesは、Googleが社内で使用していたBorgシステムから得た知見を基に開発されました。複数のホスト(ノード)を束ねてクラスタを構成し、その上でコンテナを効率的に稼働させるためのオーケストレーションツールです。
主な機能:
- サービスディスカバリと負荷分散: コンテナへのトラフィックを分散します。
- ストレージオーケストレーション: ローカルストレージやクラウドプロバイダーのストレージを自動的にマウントします。
- 自動ロールアウトとロールバック: アプリケーションの更新を段階的に行い、問題があれば元に戻します。
- 自己修復 (Self-healing): 失敗したコンテナを再起動し、応答しないコンテナを置き換えます。
AKSのアーキテクチャとMC_リソースグループ
Azure Kubernetes Service (AKS) は、Azureが提供するマネージドKubernetesサービスです。AKSを使用すると、コントロールプレーン(マスターノード)の管理をAzureに任せることができます。
コントロールプレーンとノード
- コントロールプレーン: Azureによって管理され、無償で提供されます(SLA付きのStandard Tierを除く)。APIサーバー、スケジューラー、etcdなどが含まれます。
- ノード(エージェントプール): ユーザーのアプリケーションが実際に動作する仮想マシンです。これらはユーザーのサブスクリプション内に作成されます。
システムノードとユーザーノード
AKSのノードプールには、役割に応じて2つのモードがあります。
- システムノードプール (System Node Pool):
- CoreDNSやMetrics Serverなどの重要なシステムPodをホストします。
- AKSクラスタには少なくとも1つのシステムノードプールが必要です。
- OSはLinuxのみサポートされます。
- ユーザーノードプール (User Node Pool):
- ユーザーのアプリケーションPodをホストするためのノードプールです。
- 必要に応じて複数のユーザーノードプールを作成できます。
- LinuxおよびWindowsノードがサポートされます。
MC_リソースグループについて
AKSクラスタを作成すると、指定したリソースグループとは別に、自動的にノードリソースグループが作成されます。デフォルトの命名規則は MC_<ResourceGroupName>_<ClusterName>_<Location> です。
この MC_ リソースグループには、クラスタの動作に必要な以下のAzureリソースが自動的に配置されます:
- Virtual Machine Scale Sets (VMSS): ノードプールを構成する仮想マシン群。
- Virtual Network (VNet) & Subnets: ノード間の通信や外部との接続を提供するネットワーク(BYO VNetを使用しない場合)。
- Load Balancer: Service (type: LoadBalancer) や Ingress Controller へのトラフィックを分散するためのロードバランサー。
- Network Security Groups (NSG): 通信制御を行うセキュリティグループ。
- Managed Identities: AKSが他のAzureリソース(ACRやNetworkなど)を操作するためのID。
- Public IP Addresses: 外部公開用のIPアドレス。
- Disks: Persistent Volume (PV) として使用されるManaged Disks。
この MC_ リソースグループ内のリソースを直接手動で変更・削除すると、AKSクラスタが正常に動作しなくなる可能性があります。原則として、KubernetesのマニフェストやAzure CLI/PortalのAKS管理画面を通じて操作してください。
主要リソース (Key Resources)
Kubernetesでは、クラスタの状態を定義するために「オブジェクト」または「リソース」を使用します。これらは通常、Manifest (マニフェスト) と呼ばれるYAML形式のファイルで定義されます。
Manifest (マニフェスト)
Kubernetesリソースの「あるべき状態(Desired State)」を記述した設定ファイルです。kubectl apply -f <filename>.yaml コマンドなどでクラスタに適用します。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:latest
Pod (ポッド)
Kubernetesにおけるデプロイの最小単位です。1つ以上のコンテナを含みます。同じPod内のコンテナは、IPアドレスやストレージボリュームを共有します。通常、Podを直接作成することは少なく、Deploymentなどの上位リソースを通じて管理します。
ReplicaSet (レプリカセット)
指定された数のPodのレプリカが常に稼働していることを保証するリソースです。Podが停止した場合、自動的に新しいPodを作成して指定数を維持します。
Deployment (デプロイメント)
ステートレスなアプリケーションを管理するためのリソースです。ReplicaSetを管理し、アプリケーションのローリングアップデートやロールバックを容易にします。WebサーバーやAPIサーバーなどのデプロイに最もよく使用されます。
StatefulSet (ステートフルセット)
データベースのように状態を持つ(ステートフルな)アプリケーションを管理するためのリソースです。
- Podに一意のID(順序付きのインデックス)が付与されます。
- 永続ストレージが各Podに紐付き、Podが再作成されても同じストレージが再アタッチされます。
Service (サービス)
Podの集合に対するネットワークアクセスを抽象化するリソースです。Podは再起動ごとにIPが変わる可能性がありますが、Serviceは固定のIP(ClusterIP)やDNS名を提供します。
- ClusterIP: クラスタ内部からのみアクセス可能(デフォルト)。
- NodePort: 各ノードの特定のポートで外部公開。
- LoadBalancer: クラウドプロバイダーのロードバランサーを使用して外部公開(AKSではAzure Load Balancerが作成されます)。
Ingress (イングレス)
クラスタ外部からのHTTP/HTTPSトラフィックをクラスタ内のServiceにルーティングするルールを管理するリソースです。
- パスベースやホストベースのルーティングが可能。
- SSL/TLS終端機能を提供。
- 実装にはIngress Controller(Nginx Ingress ControllerやApplication Gateway Ingress Controllerなど)が必要です。
PVC (Persistent Volume Claim)
Podが永続ストレージを要求するためのリソースです。
- PV (Persistent Volume): 実際のストレージ実体(Azure DiskやAzure Filesなど)。
- PVC: ユーザーが必要な容量やアクセスモードを指定してPVを要求する「請求書」。
- StorageClassを使用することで、PVC作成時に動的にPV(Azure Disk等)をプロビジョニングできます。
Secret (シークレット)
パスワード、OAuthトークン、SSHキーなどの機密情報を保存・管理するためのリソースです。
- Base64でエンコードされて保存されます(暗号化ではないため、RBACやKMSでの保護が重要)。
- Podから環境変数やボリュームとしてマウントして利用します。
ServiceAccount (サービスアカウント)
Pod内で実行されるプロセスがKubernetes APIサーバーと通信するためのIDです。
- 認証と認可: PodがAPIサーバーにアクセスする際、どのServiceAccountを使用しているかによって認証され、RBAC (Role-Based Access Control) によって権限(認可)が制御されます。
- デフォルト: Pod作成時に指定しない場合、そのNamespaceの
defaultServiceAccountが自動的にマウントされます。 - Workload Identity: AKSでは、ServiceAccountをMicrosoft Entra ID (旧Azure AD) のIDと連携させることで、パスワードレスでAzureリソース(Key VaultやSQL Databaseなど)へ安全にアクセスさせることが可能です。
HPA (Horizontal Pod Autoscaler)
CPU使用率やメモリ使用量などのメトリクスに基づいて、Podのレプリカ数(DeploymentやStatefulSetの規模)を自動的にスケーリングする機能です。
- トラフィックの増減に合わせて自動的にスケールアウト/スケールインを行い、リソース効率と可用性を高めます。
- 利用するにはMetrics Serverがクラスタにインストールされている必要があります。
まとめ
Kubernetesは多くのリソースタイプを持ち、最初は複雑に見えるかもしれませんが、基本となる Pod, Deployment, Service の関係を理解することが第一歩です。AKSを使用することで、インフラ管理の負担を軽減しつつ、これらの強力な機能を活用してスケーラブルなアプリケーションを構築できます。